#编写函数输出字符串
def func():
    print("lifeibiao is a good man")
func()

#编写函数，给函数一个名字，一个年龄，在函数中打印
#函数在调用时需要按顺序传递参数并且数量得对应
#参数数量理论上无限制，实际上不要超过六到七个，参数类型没有限制
# 李飞彪 18 power money book
def func1(name, age, hobby):
    print("%s is a good man,he is %d years old!he like %s、%s and % s"%(name, age, hobby[0], hobby[1], hobby[2]))

func1("lifeibiao", 24, ["money", "power", "book"])

#函数返回值
#编写函数，实现两个数的和
#在定义的函数体中尽量不要出现print()和input()
def func3(a, b):
    # print(a + b)
    c = a + b
    return c
d = func3(4, 5)
print(d)

#函数参数传递
#值传递，传递的是不可变类型的数据
def func4(a):
    a = 10
    print(a)
e = 20
print("==============")
func4(e)
print("==============")
print(e)

#引用传递，传递的是可变类型的数据
#本质还是值传递，传递的是地址值
def func5(arr):
    arr.pop()
li = [10, 20, 30, 40]
func5(li)
print(li)

#关键字参数：允许函数调用时参数的顺序与定义时不一样
def func6(name, age):
    print("%s is a good man,he is %d years old"%(name, age))
#关键字参数
func6(age = 24, name = "lifeibiao")

#默认参数，
def func7(name, age = 10):
    print("%s is a good man,he is %d years old"%(name, age))
#函数调用时，如果没有传递参数，就使用默认参数的值
#有传递参数，就是用传递参数，默认参数写在最后
func7("lifeibiao")

#不定长参数：能处理比当初定义时更多的参数
#方式一：在变量前加*号，变量会存放所有未命名的变量的参数，
#如果在函数调用时没有指定参数，他就是一个空元组
#方式二：**kwargs
#   **代表键值对字典，和*差不多
#不定长参数在默认参数后边
def func8(name, age, *args):
    print("%s is a good man,he is %d years old"%(name, age))
    print(args, type(args))
func8("lifeibiao", 24, "money", "power", "book")

def func9(name, age, **kwargs):
    print("%s is a good man,he is %d years old"%(name, age))
    print(kwargs, type(kwargs))
func9("lifeibiao", 24, x = 1, y = 2, z = 3)

#接收任意参数
def func10(*args, **kwargs):
    print(args)
    print(kwargs)
func10(1, 2, 3, x = 1, y = 2, z = 3)

